using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.Look.Imagem.Entidades;

namespace MakeIT.Look.Imagem.Negocios
{
	public partial class LookDAOT : DAOT
	{

		public ContatoVO getContato(int? idContato, string nome)
		{
			ContatoVO contatoVO = null;
			List<ContatoVO> listContatoVOs = getContatos(idContato, nome);
			if (listContatoVOs != null && listContatoVOs.Count > 0)
			{
				contatoVO = listContatoVOs[0];
			}
			return contatoVO;
		}

		public ContatoVO getContato(int? idContato)
		{
			return getContato(idContato, null);
		}

		public List<ContatoVO> getContatos()
		{
			return getContatos(null, null);
		}

		public List<ContatoVO> getContatos(int? idContato)
		{
			return getContatos(idContato, null);
		}

		public List<ContatoVO> getContatos(int? idContato, string nome)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT Ctt.idContato as Ctt_idContato, Ctt.nome as Ctt_nome, Ctt.fone as Ctt_fone, Ctt.email as Ctt_email, Ctt.assunto as Ctt_assunto, Ctt.mensagem as Ctt_mensagem, Ctt.atendido as Ctt_atendido, Ctt.cadastro as Ctt_cadastro, Ctt.cadastradoPor as Ctt_cadastradoPor, Ctt.edicao as Ctt_edicao, Ctt.editadoPor as Ctt_editadoPor  ");
			query.AppendLine("FROM contato as Ctt ");
			if (idContato != null)
			{
				query.AppendLine(where + "Ctt.idContato=@idContato ");
				where = "AND ";
			}
			if (nome != null)
			{
				query.AppendLine(where + "Ctt.nome LIKE @nome ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY Ctt.nome ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			if (idContato!= null) cmd.Parameters.Add(getParameter(cmd, "@idContato", idContato));
			if (nome!= null) cmd.Parameters.Add(getParameter(cmd, "@nome", "%"+nome+"%"));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<ContatoVO> listContato = new List<ContatoVO>();

				while (reader.Read())
				{
					ContatoVO contatoVO = ContatoVO.CreateVO();
					contatoVO.idContato = reader.GetInt32(reader.GetOrdinal("Ctt_idContato"));
					contatoVO.nome = reader.GetString(reader.GetOrdinal("Ctt_nome"));
					if (!reader.IsDBNull(reader.GetOrdinal("Ctt_fone")))
						contatoVO.fone = reader.GetString(reader.GetOrdinal("Ctt_fone"));
					if (!reader.IsDBNull(reader.GetOrdinal("Ctt_email")))
						contatoVO.email = reader.GetString(reader.GetOrdinal("Ctt_email"));
					contatoVO.assunto = reader.GetString(reader.GetOrdinal("Ctt_assunto"));
					contatoVO.mensagem = reader.GetString(reader.GetOrdinal("Ctt_mensagem"));
					contatoVO.atendido = reader.GetString(reader.GetOrdinal("Ctt_atendido")).Equals("S");
					contatoVO.cadastro = reader.GetDateTime(reader.GetOrdinal("Ctt_cadastro"));
					contatoVO.cadastradoPor = reader.GetString(reader.GetOrdinal("Ctt_cadastradoPor"));
					contatoVO.edicao = reader.GetDateTime(reader.GetOrdinal("Ctt_edicao"));
					contatoVO.editadoPor = reader.GetString(reader.GetOrdinal("Ctt_editadoPor"));


					listContato.Add(contatoVO);
				}
				reader.Close();
				return listContato;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setContato(ContatoVO contatoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE contato ");
			query.AppendLine("SET nome=@nome, fone=@fone, email=@email, assunto=@assunto, mensagem=@mensagem, atendido=@atendido,  cadastro=@cadastro, cadastradoPor=@cadastradoPor, edicao=@edicao, editadoPor=@editadoPor ");
			query.AppendLine("WHERE idContato=@idContato ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idContato", contatoVO.idContato));
			cmd.Parameters.Add(getParameter(cmd, "@nome", contatoVO.nome));
			if (contatoVO.fone == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone", contatoVO.fone));
			if (contatoVO.email == null)
				cmd.Parameters.Add(getParameter(cmd, "@email", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@email", contatoVO.email));
			cmd.Parameters.Add(getParameter(cmd, "@assunto", contatoVO.assunto));
			cmd.Parameters.Add(getParameter(cmd, "@mensagem", contatoVO.mensagem));
			cmd.Parameters.Add(getParameter(cmd, "@atendido", (contatoVO.atendido==null?" ":(contatoVO.atendido.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", contatoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", contatoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", contatoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", contatoVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newContato(ContatoVO contatoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO contato ");
			query.AppendLine("  ( nome, fone, email, assunto, mensagem, atendido, cadastro, cadastradoPor, edicao, editadoPor ) ");
			query.AppendLine("VALUES ( @nome, @fone, @email, @assunto, @mensagem, @atendido, @cadastro, @cadastradoPor, @edicao, @editadoPor ) ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@nome", contatoVO.nome));
			if (contatoVO.fone == null)
				cmd.Parameters.Add(getParameter(cmd, "@fone", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@fone", contatoVO.fone));
			if (contatoVO.email == null)
				cmd.Parameters.Add(getParameter(cmd, "@email", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@email", contatoVO.email));
			cmd.Parameters.Add(getParameter(cmd, "@assunto", contatoVO.assunto));
			cmd.Parameters.Add(getParameter(cmd, "@mensagem", contatoVO.mensagem));
			cmd.Parameters.Add(getParameter(cmd, "@atendido", (contatoVO.atendido==null?" ":(contatoVO.atendido.Value?"S":"N"))));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", contatoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", contatoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", contatoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", contatoVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('contato') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delContato(ContatoVO contatoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM contato ");
			query.AppendLine("WHERE idContato=@idContato ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idContato", contatoVO.idContato));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
	}
}
